﻿using System;
using System.Collections.Generic;

// 学生类：封装学生信息
public class Student
{
    // 学生属性
    public int Id { get; set; }      // 学号
    public string Name { get; set; } // 姓名
    public int Age { get; set; }     // 年龄

    // 构造函数：初始化学生信息
    public Student(int id, string name, int age)
    {
        Id = id;
        Name = name;
        Age = age;
    }

    // 重写ToString，方便打印学生信息
    public override string ToString()
    {
        return $"学号：{Id}，姓名：{Name}，年龄：{Age}";
    }
}

// 班级类：支持按索引访问学生
public class Class
{
    private List<Student> _students; // 存储班级学生的集合
    public string ClassName { get; set; } // 班级名称

    // 构造函数：初始化班级名称和学生集合
    public Class(string className)
    {
        ClassName = className;
        _students = new List<Student>();
    }

    // 辅助方法：添加学生到班级
    public void AddStudent(Student student)
    {
        if (student == null)
            throw new ArgumentNullException(nameof(student), "学生对象不能为null");
        _students.Add(student);
    }

    // 辅助属性：获取班级学生数量（用于索引边界检查）
    public int StudentCount => _students.Count;

    // 索引器：实现按索引访问/修改学生
    public Student this[int index]
    {
        get
        {
            // 检查索引合法性（小于0或超出学生数量）
            if (index < 0 || index >= _students.Count)
                throw new ArgumentOutOfRangeException(nameof(index), "索引超出范围");
            return _students[index]; // 返回指定索引的学生
        }
        set
        {
            // 检查索引合法性
            if (index < 0 || index >= _students.Count)
                throw new ArgumentOutOfRangeException(nameof(index), "索引超出范围");
            if (value == null)
                throw new ArgumentNullException(nameof(value), "学生对象不能为null");
            _students[index] = value; // 修改指定索引的学生
        }
    }
}

// 测试程序（包含入口点Main方法）
class Program
{
    static void Main(string[] args)
    {
        try
        {
            // 1. 创建班级
            Class class1 = new Class("高一（1）班");
            Console.WriteLine($"创建班级：{class1.ClassName}");

            // 2. 向班级添加学生
            class1.AddStudent(new Student(101, "张三", 16));
            class1.AddStudent(new Student(102, "李四", 17));
            class1.AddStudent(new Student(103, "王五", 16));
            Console.WriteLine($"班级共有{class1.StudentCount}名学生：");

            // 3. 通过索引访问学生（像数组一样）
            for (int i = 0; i < class1.StudentCount; i++)
            {
                Console.WriteLine($"索引{i}：{class1[i]}");
            }

            // 4. 通过索引修改学生信息
            Console.WriteLine("\n修改索引1的学生信息...");
            class1[1] = new Student(102, "李小四", 18); // 修改“李四”为“李小四”，年龄改为18
            Console.WriteLine($"修改后索引1的学生：{class1[1]}");

            // 5. 测试索引越界（预期抛出异常）
            Console.WriteLine("\n尝试访问索引3的学生（超出范围）：");
            Console.WriteLine(class1[3]);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误：{ex.Message}");
        }
    }
}